#include "ConfSock.h"
	/**************************************************************************************************/
	/**** FUNCIONES A UTILIZAR PARA LA COMUNICACION ATRAVES DE SOCKETS DE PROTOCOLO TCP/IP ************/
	/**************************************************************************************************/
	

/** Teniendo en cuenta el archivo de configuracion se conecta a la 
    capa de almacenamiento generando un nuevo Socket para  Inter-Process-Communication 
**/	
int32_t ConnectByConfig(void){

	int32_t Sock,PORT,valor;
	struct sockaddr_in their_addr;
	char *IP;
	IP = ObtenerIP();
	PORT= ObtenerPuerto();
	
	Sock = (int32_t)socket(AF_INET,SOCK_STREAM,0);
	their_addr.sin_family = AF_INET;
	their_addr.sin_port = htons(PORT);  //PUERTO A CONECTAR OBTENIDO DEL ARCHIVO DE CONFIGURACION 
	their_addr.sin_addr.s_addr = inet_addr(IP);
	memset(&(their_addr.sin_zero),'\0', 8);
	valor=connect(Sock, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)); 
	free(IP);
	if(valor==-1){
		perror("connect");
		Sock= -1;
	}
	return Sock;
}	



/**************************** Funciones para Archivo de Configuracion********************************************/
int32_t ObtenerCadena(char *archivo, char ReadBuffer[200],int32_t linea){
	FILE *f1; 
	int32_t i=1;
	
	f1 = fopen(archivo,"rb");
	if (f1==NULL){
	   printf("No se puede abrir el archivo de Configuracion.\n");
	   return -1;
	}
	while (i<=linea){
		fgets(ReadBuffer,200,f1);
		i++;
	}
    fclose(f1);
	return 0;

}

char *ObtenerIP(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	int32_t pos=0,j=0;
	char ReadBuffer[200];
	char *IP = malloc(20);
	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer, '\0',200);
	memset(IP, '\0',20);
	ObtenerCadena(ruta,ReadBuffer,1);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;
		
	j++;
	while(ReadBuffer[j]!='\n'){
		IP[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	return IP;		
}

int32_t ObtenerPuerto(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	char Puerto[5];
	int32_t pos=0,j=0,port;
	char ReadBuffer[200];
	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer,'\0', 200);
	ObtenerCadena(ruta,ReadBuffer,2);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;
		
	j++;
	while(ReadBuffer[j]!='\n'){
		Puerto[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	port = atoi(Puerto);
	return port;		
}

int32_t CantMaxConex(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	char Conex[5];
	int32_t pos=0,j=0,cantMaxConex;
	char ReadBuffer[200];
	
	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer,'\0', 200);
	ObtenerCadena(ruta,ReadBuffer,3);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;
		
	j++;
	while(ReadBuffer[j]!='\n'){
		Conex[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	cantMaxConex = atoi(Conex);
	return cantMaxConex;
}

int32_t TamanioCache(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	char Puerto[5];
	int32_t pos=0,j=0,tamanio;
	char ReadBuffer[200];
	
	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer,'\0',200);
	ObtenerCadena(ruta,ReadBuffer,4);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;
		
	j++;
	while(ReadBuffer[j]!='\n'){
		Puerto[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	tamanio = atoi(Puerto);
	return tamanio;
}

int32_t TamanioCacheG(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	char Puerto[5];
	int32_t pos=0,j=0,tamanio;
	char ReadBuffer[200];

	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer,'\0',200);
	ObtenerCadena(ruta,ReadBuffer,5);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;

	j++;
	while(ReadBuffer[j]!='\n'){
		Puerto[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	tamanio = atoi(Puerto);
	return tamanio;
}

int32_t LogActivado(){
	char *ruta;
	int32_t ObtenerCadena(char*,char[200],int32_t);
	char Puerto[5];
	int32_t pos=0,j=0,activado;
	char ReadBuffer[200];

	ruta=(char*)calloc(1,(strlen("ArchivoConfig.txt")+1));
	strcpy(ruta,"ArchivoConfig.txt");
	memset(ReadBuffer,'\0',200);
	ObtenerCadena(ruta,ReadBuffer,6);
	free(ruta);
	while(ReadBuffer[j]!=':')
		j++;

	j++;
	while(ReadBuffer[j]!='\n'){
		Puerto[pos]=ReadBuffer[j];
		j++;
		pos++;
	}
	activado = atoi(Puerto);
	return activado;
}


/** Funcion que conecta,hace handShake y le da el nombre a la capa 
	de almacenamiento y devuelve el Sock que se genera para la Inter-Process-Communication
**/


int32_t ConectarCapaAlmacenemiento(){
	int32_t ret=0,Sock = 1;

	Sock=ConnectByConfig();
	ret=HandShakeEmisor(Sock,0);
	if(ret==1){
		Nombre(Sock,"PFS",'F');
		//printf("Ya le di mi nombre\n");
	}	
	else{
		printf("No se pudo conectar a la capa de Almacenamiento\n");
		exit(EXIT_FAILURE);
	}

	return Sock;
}
